package main

import (
	"fmt"
	"go_web/pkg/config"
	gen2 "go_web/pkg/utils/gen"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
)

func GenerateModelsAndRepo(db *gorm.DB) {

	g := gen.NewGenerator(gen.Config{
		OutPath:           "./dal/repo", // repo 包输出目录
		ModelPkgPath:      "model",      // 模型包名改成 model
		Mode:              gen.WithDefaultQuery | gen.WithoutContext,
		FieldWithIndexTag: true,
		FieldWithTypeTag:  true,
	})

	g.UseDB(db)

	// 定义字段类型映射选项
	softDeleteOpt := gen.FieldType("is_deleted", "gorm.DeletedAt")
	versionOpt := gen.FieldType("version", "optimisticlock.Version")
	ignoreIsDeletedOpt := gen.FieldJSONTag("is_deleted", "-")

	ignoreVersionOpt := gen.FieldJSONTag("version", "-")

	// 为所有表应用字段类型映射
	allModels := g.GenerateAllTable(softDeleteOpt, versionOpt, ignoreIsDeletedOpt, ignoreVersionOpt)

	// 应用基础模型
	g.ApplyBasic(allModels...)

	g.Execute()
}

func GenerateReq(db *gorm.DB) {
	// 配置 RequestEntityConfig
	reqConfig := gen2.RequestEntityConfig{
		DB:           db,
		DatabaseName: "go_web",    // 你的数据库名
		PackageName:  "req_sys",   // 生成文件的包名
		OutputPath:   "./dal/req", // 生成文件的输出目录
		Tables:       []string{},  // 需要生成请求实体的表
		IgnoreFields: []string{"create_time", "modify_time", "creator_id",
			"modifier_id", "is_deleted", "version"}, // 忽略的字段
	}

	// 调用 GenerateRequestEntities 方法生成请求实体文件
	if err := gen2.GenerateRequestEntities(reqConfig); err != nil {
		log.Fatalf("生成请求实体失败: %v", err)
	} else {
		fmt.Println("请求实体文件生成成功！")
	}
}

func GenerateModels(db *gorm.DB) {
	columnConfigs := []gen2.ColumnInfo{
		{
			Name:            "version",
			ExcludeFromJSON: true, // 排除 JSON 序列化
		},
		{
			Name:      "version",
			ForceType: "optimisticlock.Version", // 强制类型为 optimisticlock.Version
		},
		{
			Name:            "is_deleted",
			ExcludeFromJSON: true, // 排除 JSON 序列化
		},
		{
			Name:      "is_deleted",
			ForceType: "soft_delete.DeletedAt", // 强制类型为 gorm.DeletedAt
		},
	}
	// 配置模型生成
	config := gen2.ModelConfig{
		DB:                db,
		DatabaseName:      "go_web",      // 数据库名称
		PackageName:       "model_sys",   // 生成的 Go 包名称
		OutputPath:        "./generated", // 生成代码的输出目录
		ColumnInfos:       columnConfigs, // 传递字段配置
		IgnoreStructsTags: []string{"version", "is_deleted", "create_time", "modify_time", "creator_id", "modifier_id"},
		//Tables:            []string{"sys_route_auth"},
	}

	gen2.GenerateModels(config)

}

func main() {
	// 1. 初始化配置
	if err := config.Init(
		config.WithConfigDir("./configs"),
		config.WithEnv("dev"),
	); err != nil {
		log.Fatalf("配置初始化失败：%v", err)
	}
	fmt.Println("✅ 配置模块初始化成功")

	// 读配置
	cfg := config.Get()

	// 构建 MySQL DSN
	dsn := fmt.Sprintf(
		"%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%t&loc=%s",
		cfg.Database.User,      // 数据库用户名
		cfg.Database.Password,  // 数据库密码
		cfg.Database.Host,      // 数据库地址
		cfg.Database.Port,      // 数据库端口
		cfg.Database.DBName,    // 数据库名
		cfg.Database.Charset,   // 字符集
		cfg.Database.ParseTime, // 是否解析时间
		cfg.Database.Loc,       // 时区
	)

	db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		panic(err)
	}

	fmt.Println(db)
	//GenerateModels(db)
	//GenerateModelsAndRepo(db) // gorm-gen
	//GenerateReq(db) // 生成 req 实体
	gen2.GenerateService(db, "go_web", nil)
	//gen2.GenerateHandler(db, "sp3ma", nil)
	//gen2.GenerateRoutes(db, "go_web", nil) // 生成初始化 routes 文件
	//gen2.GenerateSetupRoutes(db, "go_web", nil) // 生成初始化 setup_routes 文件

}
